package delphorm.web.aspect;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;

import org.springframework.aop.MethodBeforeAdvice;

import delphorm.entite.personne.DroitGroupe;
import delphorm.entite.personne.GroupeCollectif;
import delphorm.entite.personne.Utilisateur;
import delphorm.service.personne.IGroupeCollectif;
import delphorm.web.exception.SecuriteException;


public class VerifierAjouterGroupeCollectif implements MethodBeforeAdvice, Verif {
	
	IGroupeCollectif serviceGroupeCollectif;
	
	public IGroupeCollectif getServiceGroupeCollectif() {
		return serviceGroupeCollectif;
	}

	public void setServiceGroupeCollectif(IGroupeCollectif serviceGroupeCollectif) {
		this.serviceGroupeCollectif = serviceGroupeCollectif;
	}

	public void before(Method method, Object[] arguments, Object target) 
			throws Throwable {
		Object[] args = new Object[2];
		args[0] = ((HttpServletRequest)arguments[0]).getSession().getAttribute("utilisateur");
		String idG = ((HttpServletRequest)arguments[0]).getParameter("idgroupecollectif");
		if(idG!=null)
		{
			Long idGC = new Long(Long.parseLong(idG));
			args[1] = idGC;
		}
		else
		{
			args[1] = null;
		}
		if(!doVerif(args))
			throw new SecuriteException("exception.ajoutergroupecollectif.pasledroit");
		
	}
	
	public boolean doVerif(Object[] objects) {
		Utilisateur utilisateur = (Utilisateur)objects[0];
		
		//si on crée un roupe
		if(objects[1] == null)
		{
			//l'utilisateur a le droit Voir tous les utilisateurs
			if(utilisateur.getDroitsGeneraux().getCreerGroupe().booleanValue() == true)
				return true;
		}
		//on modifie un groupe
		else
		{
			if(utilisateur.getDroitsGeneraux().getModifierTousGroupes().booleanValue() == true)
				return true;
			else
			{
				
				//récupère le groupe
				GroupeCollectif groupe = serviceGroupeCollectif.chercherGroupeParId((Long)objects[1]);
				DroitGroupe droitGroupe = utilisateur.getDroitGroupeCollectif(groupe);
				if(droitGroupe.getModifierGroupe().booleanValue() == true)
					return true;
			}
		}
		
		return false;
	}

}
